// 在 Unity 材质面板中，该 Shader 将位于 Graph 文件夹下的 "Point Surface GPU" 分类中
Shader "Graph/Point Surface GPU" {
    Properties {
        // 属性：_Smoothness（光滑度 / 镜面反射度），类型为 Range，范围 0 到 1，默认 0.5
        // 用于控制材质的 Specular / Smoothness 反光程度
        _Smoothness ("Smoothness", Range(0,1)) = 0.5
    }


    SubShader {

        CGPROGRAM
        // ========================= 表面着色器编译指令 =========================

        // 指定使用 Unity 的 "Surface Shader" 模板，并定义表面着色函数名为 ConfigureSurface
        // 使用的是 Standard 光照模型（PBR 标准光照），支持完整的前向阴影和附加阴影
        #pragma surface ConfigureSurface Standard fullforwardshadows addshadow

        // 启用 GPU 实例化（Instancing）的相关选项
        // assumeuniformscaling：假设实例化的物体具有统一的缩放比例，优化性能
        // procedural:ConfigureProcedural：表示使用自定义的 ConfigureProcedural 函数处理程序化实例化逻辑（虽然这里未定义，但预留了接口）
        #pragma instancing_options assumeuniformscaling procedural:ConfigureProcedural

        // 允许在编辑器中修改 Shader 后立即重新编译（热重载），方便开发调试
        #pragma editor_sync_compilation

        // 指定该 Shader 的目标为 Shader Model 4.5，支持 ComputeBuffer 等高级特性
        #pragma target 4.5

        // ========================= 引入外部 HLSL 文件 =========================
        // 引入一个名为 "PointGPU.hlsl" 的 HLSL 文件
        // 该文件可能包含与 GPU 计算点位置相关的缓冲区绑定、结构定义等内容（比如 _Positions 缓冲区）
        #include "PointGPU.hlsl"

        // ========================= 输入结构体（Input） =========================
        // 定义一个 Input 结构，用于向表面函数 ConfigureSurface 传递数据
        // 在本例中，传递了当前像素点在世界空间中的位置 worldPos
        struct Input {
            float3 worldPos; // 世界空间中的位置，通常由 Unity 自动填充
        };

        // 从 Properties 中导入的 _Smoothness 参数，用于控制反光光滑度
        float _Smoothness;

        // ========================= 表面着色函数（核心逻辑） =========================
        // 函数名：ConfigureSurface
        // 作用：定义材质表面的颜色、光滑度等 PBR 属性
        // 参数：
        //   - input：包含诸如 worldPos 等信息的输入结构
        //   - surface：SurfaceOutputStandard 类型的结构，用于设置最终的材质输出（Albedo, Normal, Smoothness, Metallic 等）
        void ConfigureSurface (Input input, inout SurfaceOutputStandard surface) {
            // 设置 Albedo（基础颜色 / 反照率）
            // 这里使用 worldPos 的三个分量，将其从 [-1, 1] 或其它范围映射到 [0, 1]，作为 RGB 颜色值
            // saturate(x) 会将 x 限制在 [0, 1] 范围内，保证颜色值合法
            surface.Albedo = saturate(input.worldPos * 0.5 + 0.5);

            // 设置 Smoothness（光滑度 / 镜面反射强度），使用 _Smoothness 参数控制
            surface.Smoothness = _Smoothness;
        }
        ENDCG
    }
    FallBack "Diffuse"
}